#ifndef _BUOLA_WIDGETS_CDIRTREE_H_
#define _BUOLA_WIDGETS_CDIRTREE_H_

#include <buola/widgets/ctreebox.h>
#include <buola/threads/csyncqueue.h>
#include <buola/io/cfolder.h>

namespace buola { namespace gui {

class CDirTreeAction
{
public:
    int mCode;
    gui::CTreeBox::SNode *mNode;
    io::CURI mURI;
};

class CDirTree : public gui::CTreeBox
{
public:
    CDirTree();
    ~CDirTree();

    void SetFilter(io::PFileFilter);

    void SetURI(const io::CURI&);
    io::CURI GetURI(SNode*);
    io::CFile GetFile(SNode*);

    void SelectDir(const io::CURI&);

protected:
    void AddDir(SNode*,const io::CFolder&,bool=true);

    void FillTree();

    void AddAction(int,SNode* =nullptr,const io::CURI& =io::CURI());

public:
//////////////// Event handling ////////////////
    virtual void OnFillMenu(gui::PMenu,bool);
    virtual void OnNodeExpandedFirstTime(SNode*);
    virtual void OnNodeRemoved(SNode*);

    void DoSelectDir(const io::CURI &pURI);
    void DoFillTree();
    void DoNodeExpandedFirstTime(SNode*);

    void OnActionsThread();

    bool WillAccept(SNode*,gui::CDrop*);
    void OnDrop(SNode*,gui::CDrop*,gui::EDNDActions);
    void OnIntAction(TID pAction,const io::CFile &pFile);

    UEvent<void(TID,io::CURI pURI)> eIntAction;

////////////////// Data
protected:
    io::PFileFilter mFilter;

    io::CURI mURI;
    int mNumNodes;

    io::CFolder mFolder;

    bool mCancelFill;
    CSyncQueue<CDirTreeAction*> mPendingActions;
};

/*namespace gui*/ } /*namespace buola*/ }

#endif
